// utility Demo
// Created by Administrator on 2025/6/27.
//

#include <iostream>
#include <vector>
using namespace std;


/**
 * 1、pair
 * 存储两个类型的数据
 */
void pairFunc() {
    pair p = make_pair(10, "xiaoming");
    cout << "我的学号是：" << p.first << endl;
    cout << "我的名称是：" << p.second << endl;
}

/**
 * 2、swap
 * 交换两个变量的值
 */
void swapFunc() {
    int num1 = 20;
    int num2 = 30;
    cout << "num1 value:\t" << num1 << endl;
    cout << "num2 value:\t" << num2 << endl;
    swap(num1, num2);
    cout << endl;
    cout << "num1 value:\t" << num1 << endl;
    cout << "num2 value:\t" << num2 << endl;
}

/**
 * 3、move
 * 将 vec1 中的数据移动到 vec2 中
 */
void moveFunc() {
    vector<int> vec1 = {1, 2, 3, 4, 5};
    const vector<int> vec2 = move(vec1);

    cout << "vec1 values:\t";
    for (const int i: vec1) {
        cout << i << "\t";
    }
    cout << endl;

    cout << "vec2 values:\t";
    for (const int i: vec2) {
        cout << i << "\t";
    }
    cout << endl;
}


/**
 * 4、forward ：完美转发，用于在模板函数中将参数以原始的值类别（左值或右值）传递给另一个函数
 *
 */


void process(int &i) {
    // 左值引用，用于操作具体变量名
    cout << "Lvalue reference to " << i << endl;
}

void process(int &&i) {
    // 右值引用，用于操作临时值或即将被移动的对象
    cout << "Rvalue reference to " << i << endl;
}

template<typename T>
void forwardExample(T &&t) {
    // && 表示参数可以接受左值引用或右值引用
    process(forward<T>(t)); // forward<T>(t) 表示将 t 转换为左值引用或右值引用
}

void forwardFunc() {
    int x = 20;
    forwardExample(x); // x 是左值
    forwardExample(20); // 20 是右值
    forwardExample(move(x)); // move(x) 表示将 x 转换为右值引用

    // 什么是左值，右值？ 左值是存储在存储器中的对象，右值是临时对象，如函数返回值、临时变量等
    // 简单理解：存储在变量中的值为左值，临时值为右值
}

/**
 * 5、declval ：在不实际构造对象的情况下，用于参数与类型推导和表达式有效性检查。
 */

struct MyClass {
    int foo(double) const {
        cout << "call foo function." << endl; // 此处不会打印，因为并非调用
        return 45;
    }
};


template<typename T>
void declValFunc() {
    // 检查 T 类是否存在 foo 方法，并通过模拟传参进行校验（并非调用）（编译时检查）
    using R = decltype(declval<T>().foo(10.0));
    // foo 方法返回的类型是否为 int。 1 = 是，0 = 否
    cout << is_same_v<R, int> << endl;
}


int main(int argc, char *argv[]) {
    // pairFunc();
    // swapFunc();
    // moveFunc();
    // forwardFunc();
    declValFunc<MyClass>();
}
